Это не совсем про глаза. Это про векторную графику, средствами которой глаза можно изображать. Их можно изобразить и просто обрисовав очертания ломаными линиями, и залить полученные контуры нужным цветом. Но вот загвоздка - если мы делаем мультфильм, в котором персонаж моргает, или, того хуже - поводит глазами в разные стороны, то переделывать каждый раз изображение глаз для нового кадра будет ой как непросто.
Однако выход есть. Мы создаём не просто ломаные линии, а стоки - некие изображения с уже готовыми функциями. Про это я вам сейчас и расскажу.
Но сначала о простых Ломаных. Ломаная в программе «Стереометрические модели» делается так. Активируем инструмент «создание точки» и кликаем по рисунку. Тотчас на этом месте появляется точка заливки.
Мы выбираем эту точку – кликаем по ней правой кнопкой мыши, и Ломаная помещается в стек Выбора на левом краю окна.
Затем активируем тот инструмент, что левее, и свободными движениями стилуса окружаем точку четырьмя росчерками. То есть, не обязательно четырьмя, но от одного до четырёх. Кликаем по кнопке «ok». Возле точки заливки у нас возникают абрисы. Линии абрисов имеют ту толщину, какая указана на кнопке сверху – на иллюстрации там стоит цифра 3, и тот цвет, который выставлен сверху. А тип заливки будет 6, независимо от того, какая цифра выставлена на кнопке Плотность - на иллюстрации там стоит цифра 9.
Если в начале росчерка не была активирована кнопка «блокировка штриховки», то абрис получается замкнутым, то есть его начальная и конечная точки принудительно замыкаются. Такой абрис можно заливать цветом, не опасаясь, что заливка вытечет наружу.
Впоследствии абрисы можно переводить из замкнутой формы в разомкнутую и обратно, кликая по ним после активации кнопки «о» - обращение элементов и их преобразование.
Итак, у нас получились абрисы, некоторые замкнутые, а некоторые – разомкнутые. Они принадлежат той же Ломаной, что и точка заливки, но поскольку тип заливки равен 6, то они пока не залиты.
Теперь окончательно выбираем цвет контура, цвет фона (он и будет цветом заливки), толщину линий контура, а тип заливки выставляем на кнопке Плотность (1,2 – штриховка 3 – сплошная заливка). Кликаем по маленькой кнопке справа от выбранной Ломаной, и результат готов. Заливка распространилась от центральной точки до линий абриса, её ограничивающих.
Именно таким способом был сделан контур и черты лица – брови и рот у персонажа на иллюстрации.
У Ломаной, изображающей причёску, всего один абрис, он заливается тёмным цветом. А у Ломаной, изображающей лицо, четыре абриса – общий замкнутый контур и три незамкнутых – это черты лица. Всего две ломаных, а персонаж уже узнаваем. Правда, у него пока нет глаз.
СПЕЦИАЛЬНЫЕ ЛОМАНЫЕ ЛИНИИ
Если предполагается использовать Ломаную линию с небольшим количеством точек, можно упростить себе работу, а заодно и сэкономить память.
Выбирать Ломаную не надо, а нужно на кнопке Плотность выставить размер абриса 0,1,2 или 3 и, активировав кнопку «о», кликнуть по точке заливки.
Вокруг неё сразу возникнет окружность, состоящая из 5-ти, 11-ти, 17-ти или 23-х точек. Это и будет уже готовый абрис.
Но это тоже будут обычные абрисы, принадлежащие обычной Ломаной линии.
На иллюстрации показано, что вокруг точки заливки были сделаны два одинаковых абриса по 5 точек в каждом, а потом они были отодвинуты от этой точки. Следующим шагом будет преобразование Ломаной в сток.
Выставляем цвет радужки (зелёный) и цвет нижнего века (бежевый), размер 3 и тип заливки 9. На текстовом поле пишем две цифры – 12. Это будет номер подпрограммы, реализующей сток. Кликаем по кнопке правее выбранной Ломаной и получаем на месте абрисов то, что вы видите на иллюстрации. Блик, правда, не виден – он такого же бело-серого цвета, как и общий фон рисунка.
Выбираем один из абрисов, кликая по нему правой кнопкой мыши. Кнопками < и > находим нужную точку и клавишами со стрелочками передвигаем её на нужное место. Так же поступаем со всеми точками этого и всех других абрисов.
Мы сделали два абриса и, соответственно, сделали один глаз – абрис 0 – сам глаз, а абрис 1 – его верхнее веко. Но у ломаной может быть 4 абриса. Добавить ещё 2 нетрудно – опять активизируем «о», выставляем Плотность=0 и вновь кликаем по точке заливки. Сделав это два раза, получаем элементы для составления другого глаза.
Теперь объединяем всё вместе. У нас 2-е Ломаных – лицо и шевелюра, и одна ломаная-сток, изображающая глаза. Все ломаные и абрисы мы можем выбирать и передвигать, поворачивать, менять их размер, раздвигая или сдвигая точки, и всё это можно делать как совместно, так и раздельно.
Выбрав один из абрисов, можно менять расположение точек на нём как угодно. Словом, удобств для изменения изображения масса. А глаза открываются или закрываются простым кликом по их верхним векам.
Кстати, обратите внимание, у открытого глаза верхнее веко имеет более крутой изгиб возле носа, а у закрытого – с противоположной стороны. Это очень естественно и, вместе с тем, просто с точки зрения программирования – линия, составляющая веко, не отражается, а инвертируется. Точка её инверсии ищется как середина между крайними точками на веке, а потом она немного сдвигается в сторону средней, 3-й точки века.
Формулы инверсии необычайно просты –
X = Xо - (X - Xо)
Y = Yо - (Y - Yо), где Xо, Yо – координаты точки инверсии
Вот так выглядит графика, описывающая лицо с глазами –
1> 9 2220 0 2341 1 14 17 19 3 25535 3415 3 1 #32
2> 9 2233 0 1599 23 0 0 0 3 16912 8456 3 2 #32
3> 9 2270 0 2580 45 46 47 48 129 0 992 2 3 #32
#32 - это номер группы. Вошедшие в общую группу, элементы графики могут передвигаться совместно.
А вот так описываются в ней глаза –
абрис 0 адрес 45
0 5 2064 2259 2082 2267 2061 2240 2128 2354 1993 2361
абрис 1 адрес 46
0 5 1921 2261 1977 2197 2049 2173 2143 2204 2170 2254
абрис 2 адрес 47
0 5 2491 2257 2510 2266 2488 2238 2554 2376 2436 2368
абрис 3 адрес 48
0 5 2391 2265 2424 2195 2492 2177 2587 2224 2626 2276
Как видите, всё очень красиво и компактно.
Использование специальных векторных изображений – стоков, делает векторную графику очень удобной в её применениях.
__________
27.10.2022
Программа для работы с Ломаными полностью готова.
Скачать её можно тут - http://disk.yandex.ru/d/33Hblr886-gUdw
Пример с лицами и глазами вот - http://disk.yandex.ru/d/84YR_7gYFS0faQ
Так что, скачивайте, программа работает совместно с Виндос. Возможно, что она Вам понравится.
29.10.2022 - Вчера добавил к глазам ресницы. И случилась дополнительная удача - при зеркальном отражении глаз справа налево ресницы меняют своё направление с верха на низ, и глаза получаются полузакрытами. Три фазы изображения закрывающихся глаз, это отличный результат!
___________
для любителей программирования
Вот так выглядит подпрограмма, реализующая сток. Она достаточно сложная.
'===================
Public Sub Sto12(N As Integer) 'глаза в 5-ти точках с пропорциональной зависимостью от размера
Dim DW As Integer, DWo As Integer, NN As Integer, Ca As Long, C As Long, Z As Integer
Dim Cb As Long, C1 As Long, Cw As Long, C2 As Long, Co As Long, C3 As Long
Dim J As Integer, P As Integer, I As Integer, X As Integer, Y As Integer, X2 As Integer, Y2 As Integer
Dim X1 As Integer, Y1 As Integer, F As Integer 'флаг_разомкнутости_абриса
DW = Form1.Picture1.DrawWidth: DWo = Pvv(N, 11) + 2: 'DWo*5 *3 *2 1 -яблоко радужка зрачок ресницы,блики
NN = Pvv(N, 12) 'номер ломаной
Ca = ItoL(Pvv(N, 10)): If FLagD = 1 Then Ca = ccRGB(Ca, cBack, 0.2): 'вывод графики в бледном виде
Ca = Ckomb(Ca, NN): Ca = E(Ca): C = Ca:
If Pvv(N, 9) = 0 Then Cb = 0: GoTo 1:
Cb = ItoL(Pvv(N, 9)): If FLagD = 1 Then Cb = ccRGB(Cb, cBack, 0.2):
Cb = Ckomb(Cb, NN): Cb = E(Cb): C1 = Cb:
1 Cw = C240: If FLagD = 1 Then Cw = ccRGB(Cw, cBack, 0.2):
Cw = Ckomb(Cw, NN): Cw = E(Cw): C2 = Cw:
Co = 0: If FLagD = 1 Then Co = ccRGB(Co, cBack, 0.2):
Co = Ckomb(Co, NN): Co = E(Co): C3 = Co:
For J = 4 To 7: 'ссылки на абрисы находятся в позициях 4-7 строки Pvv(N, J) описывающей Ломаную
If J = 6 Then C = Ca + 524288: C1 = Cb + 524288: C2 = Cw + 524288: C3 = Co + 524288: 'метим абрисы цветом
If J = 5 Then C3 = Co + 2048: C1 = Cb + 2048: 'цвет нижнего века
If J = 7 Then C3 = Co + 526336: C1 = Cb + 526336: 'цвет нижнего века
F = 0: P = Pvv(N, J): If P = 0 Then GoTo 9
Nt = Ppp(P, 2): If Ppp(P, 1) <> 0 Then GoTo 9
If J = 4 Or J = 7 Then X2 = Ppp(P, 3): Y2 = Ppp(P, 4):
F = 1: If Nt > 999 Then F = 2: If J = 4 Or J = 6 Then J = J + 1: GoTo 9 'если абрис разомкнут
If J = 4 Or J = 6 Then I = Pvv(N, J + 1): If I > 0 Then I = Ppp(I, 2): If I > 999 Then GoTo 9: 'пропускаем
I = 0: Z = 1: X = Ppp(P, 3): Y = Ppp(P, 4): If Nt > 5 Then Nt = 5:
2 I = I + 1: Z = Z + 2: If Z > 11 Then P = P + 1: Z = 1:
X1 = X: Y1 = Y: X = Ppp(P, Z): Y = Ppp(P, Z + 1):
Select Case J: Case 4, 6:
If Z = 3 Then 'яблоко
Form1.Picture1.DrawWidth = DWo * 5 + 2: Form1.Picture1.PSet (X / 10, Y / 10), C3:
Form1.Picture1.DrawWidth = DWo * 5: Form1.Picture1.PSet (X / 10, Y / 10), C2:
End If
If Z = 5 Then 'радужка и зрачок
Form1.Picture1.DrawWidth = DWo * 3: Form1.Picture1.PSet (X / 10, Y / 10), C:
Form1.Picture1.DrawWidth = DWo * 2: Form1.Picture1.PSet (X / 10, Y / 10), C3:
End If
If Z = 7 Then Form1.Picture1.DrawWidth = 6: Form1.Picture1.PSet (X / 10, Y / 10), C2: 'блик
If Z = 11 And Cb > 0 Then 'нижнее веко
Form1.Picture1.DrawWidth = DWo * 3:
Form1.Picture1.Line (X1 / 10, Y1 / 10)-(X / 10, Y / 10), C1:
End If
Case Else: 'верхнее веко
If F = 1 Then
Form1.Picture1.DrawWidth = DWo:
Form1.Picture1.Line (X1 / 10, Y1 / 10)-(X / 10, Y / 10), C3:
End If
If F = 2 And Z = 3 Then 'закрытые веки
Form1.Picture1.DrawWidth = DWo:
X2 = Ppp(P, 3) / 2 + Ppp(P, 11) / 2: Y2 = Ppp(P, 4) / 2 + Ppp(P, 12) / 2: 'центр века
X2 = Ppp(P, 7) * 0.2 + X2 * 0.8: Y2 = Ppp(P, 8) * 0.2 + Y2 * 0.8: 'небольшая поправка
For I = 3 To 11 Step 2:
X = Ppp(P, I): Y = Ppp(P, I + 1):
X = X2 - (X - X2): Y = Y2 - (Y - Y2): 'инверсия
If I = 3 Then X1 = X: Y1 = Y: GoTo 8:
Form1.Picture1.Line (X1 / 10, Y1 / 10)-(X / 10, Y / 10), C3:
X1 = X: Y1 = Y:
8 Next I:
End If
End Select:
If I < Nt Then GoTo 2
9 Next J: Form1.Picture1.DrawWidth = DW:
End Sub
'===================
ПРИМЕЧАНИЕ. Вывод графики в бледном виде используется для того, чтобы запомнить бледное изображение и подкладывать его под новый кадр анимации во время его редактирования. Так видна разница между тем, что было, и тем, что сейчас. И мультипликацию становится делать легче.